package java_1_8.interface_test;

/**
 * 业务接口：需要干的事--即要买的东西
 */
interface ISubject{
    //买电脑是核心业务
    void buyComputer();
}
/**
 * 真实业务类，真正付钱买电脑的人
 */
class RealSubject implements ISubject{
    @Override
    public void buyComputer() {
        System.out.println("买个mac pro  15寸顶配");
    }
}
/**
 * 代理类,赋值我们买电脑
 * 代理类中，有买电脑的辅助操作【买电脑之前之后干的事】
 */
class ProxySubject implements ISubject{
    private ISubject realSubject;//在真正成交之前，买电脑的人也不知道具体是哪个代购帮买，代购的人也不知道具体要帮谁买，所以这块用的是接口，而不是具体哪个子类
   public ProxySubject(ISubject subject){//通过构造方法把真实业务传进来
       this.realSubject=subject;
   }
    public void  preHandle(){
        System.out.println("买票去某地看好电脑");
    }
    @Override
    public void buyComputer() {
        //调用买前操作
        preHandle();
        //付钱这个操作是通过真实业务处理的【通过构造方法把真实业务传进来】
        this.realSubject.buyComputer();
        //调用买后操作
        postHandle();
    }
    public void postHandle(){
        System.out.println("再买票把电脑带回来");
    }
}
/**
 * 最终通过平台Platform，将代理人和客户产生联系
 * 创建了代理类，在创建了代理类的同时把客户RealSubject就传入了
 */
class Platform{
    public static ISubject getInstance(){
        //在代购平台上下单
        return new ProxySubject(new RealSubject());
    }
}

/**
 * Subject:业务
 */
public class Subject {
    public static void main(String[] args) {
        ISubject subject=Platform.getInstance();//取得一个业务的对象
        subject.buyComputer();
    }
}
